package main

import (
	"fmt"
	"path/filepath"
	"runtime"

	"gorm.io/driver/postgres"
	"gorm.io/gen"
	"gorm.io/gorm"
)

func main() {
	// 1. 连接数据库
	dsn := "host=localhost user=admin password=123456 dbname=productservice port=5433 sslmode=disable"
	db, err := gorm.Open(postgres.Open(dsn))
	if err != nil {
		panic("数据库连接失败: " + err.Error())
	}

	// 2. 初始化生成器，关键：不指定任何查询相关模式

	generatePath := getResourcePath("./internal/infrastructure/persistence/model")
	fmt.Println(generatePath)
	g := gen.NewGenerator(gen.Config{
		OutPath: generatePath,       // 结构体输出目录
		Mode:    gen.WithoutContext, // 仅生成基础结构体，不包含上下文和查询方法
	})

	// 3. 关联数据库
	g.UseDB(db)

	// 4. 配置需要生成的表和字段（可选自定义）

	// 生成 products 表结构体，并自定义价格字段类型
	g.GenerateModel("products")
	g.GenerateModel("product_skus",
		gen.FieldType("shop_price", "Decimal"),
		gen.FieldType("market_price", "Decimal"),
	)

	// 5. 执行生成
	g.Execute()
}

// 获取项目内指定文件的绝对路径
func getResourcePath(relativePath string) string {
	// 获取当前源代码文件的路径（在编译后依然有效）
	_, filename, _, ok := runtime.Caller(0)
	if !ok {
		panic("无法获取当前文件路径")
	}

	// 源代码文件所在目录（如 ./cmd/main.go -> ./cmd）
	currentDir := filepath.Dir(filename)

	// 拼接项目根目录（根据实际目录结构调整）
	// 假设资源文件在项目根目录的 config 文件夹下
	projectRoot := filepath.Join(currentDir, "..", "..") // 向上两级目录
	absPath := filepath.Join(projectRoot, relativePath)

	// 转换为绝对路径
	absPath, _ = filepath.Abs(absPath)
	return absPath
}
